/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package csp;

import java.util.ArrayList;
import java.util.List;

/**
 *Singleton para la creación de estructuras de ubicaciones de antenas
 * @author Leandro
 */
public class FabricaEstructuraVariables {

    private static FabricaEstructuraVariables instancia;
    int [] variables;
    
    public static FabricaEstructuraVariables getInstancia(){
        if(instancia==null){
        instancia=new FabricaEstructuraVariables();
        }
        return instancia;

    }

    public List<Variable> getEstructura(int cantLugares) {
        List<Variable> rta=new ArrayList<Variable>();
        UbicacionAntena aux;
        variables = this.generarVariables(cantLugares);
        int[] opuestasH = this.generarOpuestosHorizontales(variables);
        int[] opuestasV = this.generarOpuestosVerticales(variables);
        
        for(int i=0;i<cantLugares;i++){
            aux=new UbicacionAntena(i);
            rta.add(aux);
        }

        for(int i=0;i<cantLugares;i++){
            aux = (UbicacionAntena) rta.get(i);
            aux.setConsecutivas(new ArrayList<UbicacionAntena>());
            aux.setVisibles(new ArrayList<UbicacionAntena>());
            if (i == 0) {
                aux.getConsecutivas().add((UbicacionAntena) rta.get(cantLugares - 1));
                aux.getConsecutivas().add((UbicacionAntena) rta.get(1));
                aux.getVisibles().add((UbicacionAntena) rta.get(cantLugares - 1));
                aux.getVisibles().add((UbicacionAntena) rta.get(1));
                aux.getVisibles().add((UbicacionAntena)rta.get(opuestasH[i]));
            } else if (i == (cantLugares - 1)) {
                aux.getConsecutivas().add((UbicacionAntena) rta.get(cantLugares - 2));
                aux.getConsecutivas().add((UbicacionAntena) rta.get(0));
                aux.getVisibles().add((UbicacionAntena) rta.get(cantLugares - 2));
                aux.getVisibles().add((UbicacionAntena) rta.get(0));
                aux.getVisibles().add((UbicacionAntena)rta.get(opuestasH[i]));
            } else {
                aux.getConsecutivas().add((UbicacionAntena) rta.get(i-1));
                aux.getConsecutivas().add((UbicacionAntena) rta.get(i+1));
                if((i%2)==0){
                    aux.getVisibles().add((UbicacionAntena) rta.get(i-1));
                    aux.getVisibles().add((UbicacionAntena) rta.get(i+1));
                    if(opuestasH[i] != (i+1)){
                        aux.getVisibles().add((UbicacionAntena)rta.get(opuestasH[i]));
                    }
                    if(opuestasV[i]!= (i-1)){
                        aux.getVisibles().add((UbicacionAntena)rta.get(opuestasV[i]));
                    }
                }
            }
        }/*
        switch(cantLugares){
            case 4:
                
                break;
            case 6:

                aux=(UbicacionAntena)rta.get(0);
                aux.getVisibles().add((UbicacionAntena) rta.get(4));

                aux=(UbicacionAntena)rta.get(1);
                aux.getVisibles().add((UbicacionAntena) rta.get(3));

                aux=(UbicacionAntena)rta.get(2);
                aux.getVisibles().add((UbicacionAntena) rta.get(5));

                aux=(UbicacionAntena)rta.get(3);
                aux.getVisibles().add((UbicacionAntena) rta.get(1));

                aux=(UbicacionAntena)rta.get(4);
                aux.getVisibles().add((UbicacionAntena) rta.get(0));

                aux=(UbicacionAntena)rta.get(5);
                aux.getVisibles().add((UbicacionAntena) rta.get(2));

                break;
            case 8:

                aux=(UbicacionAntena)rta.get(0);
                aux.getVisibles().add((UbicacionAntena) rta.get(3));

                aux=(UbicacionAntena)rta.get(1);
                aux.getVisibles().add((UbicacionAntena) rta.get(6));

                aux=(UbicacionAntena)rta.get(2);
                aux.getVisibles().add((UbicacionAntena) rta.get(5));

                aux=(UbicacionAntena)rta.get(3);
                aux.getVisibles().add((UbicacionAntena) rta.get(0));

                aux=(UbicacionAntena)rta.get(4);
                aux.getVisibles().add((UbicacionAntena) rta.get(7));

                aux=(UbicacionAntena)rta.get(5);
                aux.getVisibles().add((UbicacionAntena) rta.get(2));

                aux=(UbicacionAntena)rta.get(6);
                aux.getVisibles().add((UbicacionAntena) rta.get(1));

                aux=(UbicacionAntena)rta.get(7);
                aux.getVisibles().add((UbicacionAntena) rta.get(4));

                break;
                  
       
        }
*/
        return rta;
   }

 
    
    public int[] generarVariables (int numero){
        variables = new int[numero];
        return variables;
        
    }
      
      public int[] generarOpuestosHorizontales(int[] variables){
          int[] opuesto = new int[variables.length];
          int aux = 0;
          for (int i = 0; i<(variables.length/2);i++){
             if(i < (variables.length/2)/2 ){
              opuesto[i] = opuesto.length/2 - 1 - i;
              opuesto[opuesto.length/2 - 1 - i] = i;               
             }
          }
          for (int j = opuesto.length/2 ; j < opuesto.length;j++ ){
              if (j < variables.length - (variables.length/2)/2){
              opuesto[j] = opuesto.length- 1 - aux;
              opuesto[opuesto.length - 1 - aux] = j;
              aux++;
              }
            }
         return opuesto; 
      }
      
      public int[] generarOpuestosVerticales(int [] variables){
          int[] opuestoV = new int [variables.length];
          for (int i = 0; i<opuestoV.length/2; i++){
              opuestoV[i] = opuestoV.length - 1 - i;
              opuestoV[opuestoV.length - 1 - i] = i;
          }
          return opuestoV;
      }
  

}
